package ru.dc.gui.swing;

import org.apache.commons.lang.StringUtils;
import org.jdesktop.swingx.JXTable;

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.*;
import java.util.Set;
import java.util.TreeSet;

/**
 * Диалоговое окно для редактирования списока источников публичных хабов.
 */
public class PublicHubsSourcesDlg extends JDialog {
    private JPanel contentPane;
    private JButton closeBtn;
    private JXTable sources;
    private JButton addBtn;
    private JButton removeBtn;
    private JButton okBtn;
    private int res = JOptionPane.CANCEL_OPTION;

    public PublicHubsSourcesDlg(Frame owner) {
        super(owner);
        setTitle("Редактирование источников");
        setSize(400, 300);
        setLocation((int) (Toolkit.getDefaultToolkit().getScreenSize().getWidth() -getWidth())/2,
                (int) (Toolkit.getDefaultToolkit().getScreenSize().getHeight() -getHeight())/3);
        setContentPane(contentPane);
        setModal(true);

        getRootPane().setDefaultButton(okBtn);

        okBtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                onOK();
            }
        });

        closeBtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                onCancel();
            }
        });

// call onCancel() when cross is clicked
        setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                onCancel();
            }
        });


        //делаем кнопку "Удалить" только если выделена строка в таблице адресов
        sources.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
            public void valueChanged(ListSelectionEvent e) {
                removeBtn.setEnabled(sources.getSelectedRowCount()>0);
            }
        });

        DefaultTableModel model = new DefaultTableModel();
        model.addColumn("URL");
        sources.setModel(model);

        //слушатель кнопки "Добавить"
        final AbstractAction addRowAction = new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                addSource();
            }
        };
        addBtn.addActionListener(addRowAction);

        //слушатель кнопки "Удалить"
        final AbstractAction removeRow = new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                removeSource();
            }
        };
        removeBtn.addActionListener(removeRow);

        contentPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, 0), "addRow");
        contentPane.getActionMap().put("addRow", addRowAction);

    }

    /**
     * Удаляет выделенную строку в таблице адресов. Если не выделено ни одной строки, ничего не делает.
     */
    private void removeSource() {
        if (sources.getSelectedRowCount()<=0) {
            return;
        }
        int viewRow = sources.getSelectedRow();
        int modelRow = sources.convertRowIndexToModel(viewRow);
        DefaultTableModel model = (DefaultTableModel) sources.getModel();
        model.removeRow(modelRow);
    }

    /**
     * Добавляет строку в таблицу адресов и активирует режим редактирования этой строки.
     */
    private void addSource() {
        DefaultTableModel model = (DefaultTableModel) sources.getModel();
        model.addRow(new Object[1]);
        int rowCount = model.getRowCount();
        sources.editCellAt(rowCount-1, 0);
    }

    private void onOK() {
        res = JOptionPane.OK_OPTION;
        dispose();
    }

    private void onCancel() {
        res = JOptionPane.CANCEL_OPTION;
        dispose();
    }


    public int execute() {
        setVisible(true);
        return res;
    }

    /**
     * Устанавливает список адресов. Адреса будут добавлены в таблицу адресов.
     * @param urls адреса. Если null, то метод ничего не делает.
     */
    public void setUrls(String... urls) {
        if (urls==null) {
            return;
        }
        DefaultTableModel model = (DefaultTableModel) sources.getModel();
        for (String url : urls) {
            model.addRow(new Object[] {url});
        }
    }

    /**
     * Возвращает список адресов, введенных в таблицу адресов. Пустые значения пропускаются.
     * @return список адресов
     */
    public String[] getUrls() {
        Set<String> res = new TreeSet<String>();
        DefaultTableModel model = (DefaultTableModel) sources.getModel();
        int rowCount = model.getRowCount();
        for (int i = 0; i<rowCount; i++) {
            final Object val = model.getValueAt(i, 0);
            if (val!=null && StringUtils.isNotEmpty(val.toString())) {
                res.add(val.toString());
            }
        }
        return res.toArray(new String[res.size()]);
    }
}
